je téměř samostatně pracující jednotkou pro matematické operace v pohyblivé řádové čárce. U procesorů 8086/8088, 80186/80188, 80286 a 80386 se jednalo o samostatnou jednotku, která však byla od 80486 integrována přímo do procesoru. Její programové ovládání však zůstalo stejné kvůli zachování zpětné kompatibility, takže principy zde popsané fungují i u těchto nových typů.
Obsah:
Typy dat používané v matematickém koprocesoru
Název formátu | Označení v Pascalu | Počet slabik | Přibližný rozsah | Grafické znázornění |
Slovo integer | Integer | 2 | -32 768 až 32 767 | |
Krátký integer | Longint | 4 | -2 * 10 9 až 2 * 10 9 | |
Dlouhý integer | Comp | 8 | -9.2 * 10 18 až 9.2 * 10 18 | |
BCD zhuštěný |
| 10 | -10 18+1 až 10 18-1 | |
Krátký real | Single | 4 | ±10 -38 až ±3 * 10 38 | |
Dlouhý real | Double | 8 | ±10 -308 až ±10 308 | |
Pomocný real | Extended | 10 | ±10 -4932 až ±10 4932 |
Koprocesor interně ukládá a zpracovává pouze 80bitová reálná
čísla. Ostatní tvary jsou použity jen na vstupu a výstupu z koprocesoru a
ten je interně převádí do a z 80bitových reálných čísel.
Objekt, ve
kterém je uloženo reálné číslo, je rozdělen na tři části. Nejvyšší bit, na
obrázku označený písmenem S, je znaménkový bit. Je-li nulový, je číslo
uložené v objektu kladné. Část označená Exponent nese informaci o
velikosti čísla a Mantisa uchovává číslice čísla.
Do mantisy jsou
ukládány významné binární číslice. Neukládají se nevýznamné levostranné nuly.
Aby se šířka mantisy využila co nejvíce, ukládá se v normalizovaném
tvaru, tj. první významná číslice je umístěna v nejvyšším bitu.
Z takto definovaného pravidla vyplývá, že v nejvyšším bitu musí být
vždy jednička vyjma případu, kdy je v objektu uloženo číslo nula.
Vezmeme-li nulu jako speciální případ, může být přesnost rozšířena o jeden bit
tak, že binární jedničku nejvyššího řádu do objektu neukládáme.
Mantisa 16bitových a 32bitových reálných čísel tedy obsahuje
v nejvyšším bitu druhou významnou binární číslici. V 80bitovém reálném
číslu není nejvyšší významná číslice ignorována.
Mantisa vyjadřuje
binární číslo ve tvaru 1.xxxxxxx. Exponent potom určuje počet binárních
řádků, o které musíme destinou tečku pomyslně posunout, abychom získali
požadované číslo. Posouváme-li tečku doleva, bude exponent záporný, posováme-li
doprava, bude exponent kladný. Zjednodušeně lze číslo vyjádřit matematicky:
Mantisa × 2 Exponent
Exponent je celé číslo kladné
nebo záporné. Není vyjádřen ve dvojkovém doplňkovém kódu, jak by se dalo
předpokládat, ale v kódu posunuté nuly. Je-li prostor pro uložení exponentu
8bitový (Single Precision), je k zapisovanému číslu přičtena hodnota 7Fh
(127). Potom nula bude zapsána jako 7Fh, jednička jako 80h atd. Je-li prostor
pro uložení exponentu 11bitový (Double Precision), přičítá se 3FFh (1023), a
je-li exponent 15bitový, přičítá se 3FFFh (16383). Při čtení čísla tohoto tvaru
musíme výše uvedenou hodnotu odečíst.
Ačkoli se tento způsob ukládání čísel
zdá být nevhodný, přináší jeden významný efekt, který spočívá ve snadném
znaménkovém porovnávání dvou reálných čísel bez ohledu na jejich šířku. Obě
reálná čísla začneme srovnávat od znaménkového bitu směrem k nejnižšímu
bitu objektu. Jakmile narazíme na dvojici neshodujících se bitů, sdělí nám tyto
dva bity, které z čísel je numericky větší.
Příklady uložení reálných čísel v paměti:
Číslo | S | Exponent | Mantisa | ||
31 | 30 | 23 | 22 | 0 | |
12.5 | 0 | 1000 0010 | 1001 0000...0 | ||
-12.5 | 1 | 1000 0010 | 1001 0000...0 | ||
0.3125 | 0 | 0111 1101 | 0100 0000...0 | ||
-0.3125 | 1 | 0111 1101 | 0100 0000...0 | ||
1.0 | 0 | 0111 1111 | 0000 0000...0 |
Číslo | S | Exponent | Mantisa | ||
79 | 78 | 64 | 63 | 0 | |
12.5 | 0 | 100 0000 0000 0010 | 1100 1000...0 | ||
-0.3125 | 1 | 011 1111 1111 1101 | 1010 0000...0 |
Výhradní symboly
Nula (Zero) může být kladná nebo
záporná. Koprocesor běžně pracuje s kladnou nulou.
Nekonečno (Infinity) může být opět kladné
nebo záporné. Pokud bychom obě nekonečna srvonávali, je kladné nekonečno větší
než záporné (viz také řídící registr).
Číslo | S | Exponent | Mantisa | ||
31 | 30 | 23 | 22 | 0 | |
Kladná nula | 0 | 0000 0000 | 0000 0000...0 | ||
Záporná nula | 1 | 0000 0000 | 0000 0000...0 | ||
Kladné nekonečno | 0 | 1111 1111 | 0000 0000...0 | ||
Záporné nekonečno | 1 | 1111 1111 | 0000 0000...0 |
Nenormalizované číslo (Denormalized number) se připouští pouze tehdy, potřebujeme-li zapsat menší číslo v absolutní hodnotě, než je exponent schopen zobrazit. Potom doplněním nevýznamných levostranných nul do mantisy můžeme číslo ještě (v absolutní hodnotě) zmenšit na úkor přesnosti. O číslu musí být známo, že je v nenormalizovaném tvaru, aby se nedoplňovala jednička do nejvyššího řádu mantisy.
Nečíselné hodnoty (Not a Number) se uvádějí pod zkratkou NaN. Poněvadž nejsou povoleny všechny kombinace bitů, jsou nepovolené kombinace označeny NaN a koprocesor takové vstupní hodnoty odmítne. Nečíselné hodnory jsou rozděleny do dvou skupin: neohlašované (Quiet) a ohlašované (Signaling). Do neohlašovaných patří čísla s mantisou v rozmezí od 100...01 do 111...11. Do ohlašovaných patří 100...01 až 101...11. Obě skupiny mají exponent 111...11.
Neurčitá hodnota (Indefinite) je určena pro každý typ čísla včetně celočíselných. Běžně je neurčitá hodnota představována největším záporným číslem v absolutní hodnotě. V reálných formátech je neurčitá hodnota tvořena exponentem obsahujícím samé jedničky a mantisou obsahující 110...00.
Detekuje-li koprocesor chybu při výpočtu, procesor na tento stav odpoví
generováním výjimky 16. Koprocesor umí detekovat několik různých chyb. Konkrétní
druh chyby se oznamuje ve stavovém registru
koprocesoru. Možné chyby jsou následující:
Výjimky koprocesoru
I - |
Invalid operation - Chybná operace je detekována
rozpoznáním NaN, nepodporovaného formátu čísla, nepovolenou operací (např.
0 × nekonečno, 0/0, (kladné nekonečno) + (záporné nekonečno)) nebo
přeplněním zásobníku
(potom je také nastaveno SF). Je-li
toto přerušení maskováno, vrací se jako výsledek neohlašované NaN,
nedefinované celé číslo nebo nedefinované BCD. |
D - |
Denormalized - Nenormalizovaný výsledek je
zapříčiněn hodnotou výsledku, která je v absolutní hodnotě menší než
číslo zobrazitelné nejmenším záporným normalizovaným číslem. Je-li
přerušení maskováno, výpočet pokračuje normálně dál. |
Z - |
Divide by zero - Dělení nulou nastane tehdy,
je-li dělitel nula a dělenec je různý od nekonečna a nuly. Je-li přerušení
maskováno, je výsledek nekonečno. |
O - |
Numeric overflow - Přeplnění (Přetečení) je
detekováno tehdy, je-li výsledek větší než maximální zobrazitelné číslo
v použitém formátu dat. Je-li přerušení maskováno, je výsledek
největší možné konečné číslo nebo nekonečno. |
U - |
Numeric underflow - Nenaplnění (Podtečení)
nastane při nenulovém výsledku operace, který je tak malý, že jej nelze
v daném formátu dat zobrazit. Je-li přerušení maskováno, je výsledek
nenormalizované číslo nebo nula. |
P - |
Precision - Nepřesný výsledek nastane tehdy,
nebyl-li koprocesor schopen počítat výsledek v zadané přesnosti.
Výsledek je zaokrouhlen podle řídícího
registru. Je-li přerušení maskováno, výpočet pokračuje
dál. |
Datové registry (zásobník) Registry koprocesoru
Koprocesor
obsahuje 8 80bitových datových registrů. Tato skupina registrů může být použita
buď jako zásobník, nebo jako jednotlivě adresované registry.
Používá-li se
jako zásobník, potom je ve stavovém registru
v položce "Vrchol" číslo registru, který je právě na vrcholu zásobníku -
tj. číslo registru do kterého byla operací vložení do zásobníku zapsána poslední
hodnota.
Registr, který je právě na vrcholu zásobníku, je označován ST(0)
nebo jen ST. Ukazuje-li "Vrchol" např. na registr číslo 2, potom ST(0)
znázorňuje registr číslo 2, ST(1) registr číslo 3, ST(2) registr číslo 4, ST(5)
registr číslo 7, ST(6) registr číslo 0, ST(7) registr číslo 1.
Osm datových
registrů je skutečně implementováno jako zásobník, nikoli jako kruhová fronta.
Proto je-li do zásobníku vloženo více než 8 operandů, generuje koprocesor
přerušení chybná operace (ve stavovém registru
je nsataveno SF - chyba zásobníku a C1 - přeplnění). Přerušení se generuje také
v tom případě, pokud je ze zásobníku vybráno více než 8 položek.
Každý
z registrů má navíc ještě dvoubitovou položku v tzv. doplňujícím
registru, která obsahuje doplňující informace o registru. Jsou čtyři možné
kombinace:
00 | správný obsah registru |
01 | nula |
10 | nekonečno, NaN, nenormalizováno nebo chybný formát |
11 | prázdný |
Stavba datových registrů a doplňujícího registru:
Řídící registr (CWR)
Nastavuje některé
parametry pro výpočty v koprocesoru.
IC | (Infinity Control) určuje výklad záporného a kladného nekonečna: |
0 kladné i záporné nekonečno jsou chápány jako nekonečná veličina bez
znaménka 1 kladné a záporné nekonečno jsou pojaty jako dvě různé veličiny se znaménkem implicitně je IC nastaveno na 0 |
|
RC | (Rounding Control) řídí zaokrouhlování výsledků. Možné kombinace jsou tyto: |
00 zaokrouhlení na nejbližší číslo 01 zaokrouhlení dolů (směrem k zápornému nekonečnu) 10 zaokrouhlení nahoru (směrem ke kladnému nekonečnu) 11 oseknutí implicitně je RC nastaveno na 00 |
|
PC | (Precision Control) stanovuje přesnost výsledku. Přesnost může být snížena proto, aby byl zrychlen výpočet. Možné kombinace jsou tyto: |
00 24 bitů (Single Precision) 01 nepoužito 10 53 bitů (Double Precision) 11 64 bitů (Extended Precision) implicitně je PC nastaveno na 11 |
|
IEM | (Interrupt Error Mask) jedničkové maskuje všechna přerušení (s výjimkou situace, kdy CPU vykonává instrukci WAIT) |
PM | (Precision Mask) jedničkové maskuje přerušení vyvolané nepřesným výsledkem |
UM | (Underflow Mask) jedničkové maskuje přerušení vyvolané podtečením |
OM | (Overflow Mask) jedničkové maskuje přerušení vyvolané přetečením |
ZM | (Divide-by-Zero Mask) jedničkové maskuje přerušení vyvolané dělením nulou |
DM | (Denormalized Mask) jedničkové maskuje přerušení vyvolané nenormalizovaným výsledkem |
IM | (Invalid Operation Mask) jedničkové maskuje přerušení vyvolané chybnou operací |
B | (Busy) jedničkový oznamuje, že operace není dokončena. U vyšších procesorů neodráží aktuální stav koprocesoru a obsahuje totéž co bit ES. |
C3, C2, C1, C0 | (Condition Ci) jsou čtyři bity příznaků nastavovaných podle výsledku provedené operace. |
Vrchol | (Top) je 3bitová hodnota uchovávající číslo datového registru, který je právě na vrcholu zásobníku. |
ES | (Error Summary) je programovým duplikátem signálu FERR. Sděluje, že nastalo přerušení, které bylo vyvoláno jednou z nemaskovaných chybových příčin. |
SF | (Stack Fault) upřesňuje, že chybná operace byla vyvolána chybou v zásobníku. Pokud je tento bit nastaven, je C1=1 při přeplnění zásobníku nebo C1=0 při nenaplnění zásobníku. |
PE, UE, OE, ZE, DE, IE | Každý z těchto bitů oznamuje, že přerušení nastalo po výskytu příslušné chyby. Jednotlivé bity odpovídají bitům řídícího registru, které na rozdíl od stavového registru jednotlivá přerušení maskují. |
Instrukční repertoár a komunikace koprocesoru s procesorem
D a S | - cílové a zdrojové místo (operand) definované symbolickou adresou |
(D) a (S) | - obsah místa adresovaného D a S |
ST | - ukazatel vrcholu zásobníku |
(ST) | - obsah vrcholu zásobníku |
ST(i) | - indexovaně adresovaný registr zásobníku |
msr mlr mtr | - operand typu krátký real nebo dlouhý real nebo pomocný real v paměti |
mwi msi mli | - operand typu integer nebo krátký integer nebo dlouhý integer v paměti |
mBCD | - operand typu zhuštěný BCD v paměti |
// a / | - označení alternativních kombinací v operandovém poli instrukce |
Poznámky:
(ST) | C3 | C2 | C1 | C0 |
+ Unnormal | 0 | 0 | 0 | 0 |
+ NaN | 0 | 0 | 0 | 1 |
- Unnormal | 0 | 0 | 1 | 0 |
- NaN | 0 | 0 | 1 | 1 |
+ Normal | 0 | 1 | 0 | 0 |
+ Nekonečno | 0 | 1 | 0 | 1 |
- Normal | 0 | 1 | 1 | 0 |
- Nekonečno | 0 | 1 | 1 | 1 |
+ 0 | 1 | 0 | 0 | 0 |
Prázdný | 1 | 0 | 0 | 1 |
- 0 | 1 | 0 | 1 | 0 |
Prázdný | 1 | 0 | 1 | 1 |
+ Denormal | 1 | 1 | 0 | 0 |
Prázdný | 1 | 1 | 0 | 1 |
- Denormal | 1 | 1 | 1 | 0 |
Prázdný | 1 | 1 | 1 | 1 |
Kde číslo typu Normal je normalizované a vyhovuje formátu. Číslo typu Denormal vzniká podtečením, kdy exponent vychází menší (algebraicky), než připouští formát. Číslo typu Unnormal může vzniknout z Denormal a má exponent v žádoucím rozsahu, ale mantisu menší než 1. Při použití čísla Unnormal v další operaci ještě může vzniknout správný výsledek typu Normal. Výsledek typu NaN (Not a Number) má speciální význam a existuje jen ve formátech real. Má v exponentu jen jedničky, má znaménko a libovolnou mantisu s výjimkou hodnoty 1,00 ... 0B, která je vyhrazena pro Nekonečno. Použití NaN je popsáno v uživatelském manuálu k iAPX86, 88 vydaném společností INTEL v roce 1977.